package com.gem.day14;

import java.io.RandomAccessFile;

/**
 * 本类用来演示Java随机访问存取流
 * 
 * @author easonsy
 * 2020年8月6日 下午3:24:39
 */
public class RandomAccessFileDemo {
	public static void main(String[] args) {
		RandomAccessFileDemo demo = new RandomAccessFileDemo();
		String lastLine = demo.readLastLine("D:\\day12笔记.txt");
		System.out.println(lastLine);
	}

	/**
	 * 读取一个超大型(上百兆)文本文件的最后一行内容
	 */
	public String readLastLine(String filepath) {
		//构建随机访问存取流对象
		//注意:开启RandomAccessFile需要指定模式,r只读,rw读写模式
		try (RandomAccessFile raf = new RandomAccessFile(filepath, "r")) {
			//获取文件长度
			long pos = raf.length();
			//定义变量保存读取到的字节
			int len = -1;
			//定义一个状态变量
			boolean flag = true;
			//循环
			while (flag) {
				//从后往前移动一个单位
				pos--;
				//把文件指针定位到文件末尾
				raf.seek(pos);
				//读取当前文件指针所在位置的字节
				len = raf.read();
				//判断
				switch (len) {
				case '\n':
				case '\r':
				case -1:
					//说明最后一行内容读取完毕,此时指针所在位置是最后一行上方(换行符)
					//则把指针+1重新定位
					raf.seek(pos + 1);
					//改变状态变量
					flag = false;
				}
			}
			//此时,光标在最后一行的起始位置,直接读取一行即可
			//注意: 此处由于字节读取,所以产生乱码问题,使用字符串硬编码转换即可
			return new String(raf.readLine().getBytes("ISO-8859-1"), "UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}
